package com.changgou.mq.queue;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 延时队列配置
 *
 */
@Configuration
public class QueueConfig {

    /**
     * 创建Q1 延时队列 会过期 过期后将数据发送给Q2
     */
    @Bean
    public Queue orderDelayQueue(){
        return   QueueBuilder
                //是否持久化, 队列的声明默认是存放到内存中的，如果rabbitmq重启会丢失，
                // 如果想重启之后还存在就要使队列持久化，保存到Erlang自带的Mnesia数据库中，当rabbitmq重启之后会读取该数据库
                .durable("orderDelayQueue")
                // 创建queue时参数arguments设置了x-dead-letter-routing-key和x-dead-letter-exchange，
                // 会在x-message-ttl时间到期后把消息放到x-dead-letter-routing-key和x-dead-letter-exchange指定的队列中达到延迟队列的目的。
                .withArgument("x-dead-letter-exchange","orderListenerExchange") //orderDelayQueue会过期 过期后进入死信队列 消息超时进入死信队列，绑定死信队列交换机
                .withArgument("x-dead-letter-routing-key","orderListenerQueue") //绑定指定的routing-key
                .build();
    }

    /**
     * 创建Q2
     */
    @Bean
    public Queue orderListenerQueue(){
        return new Queue("orderListenerQueue",true);
    }

    /**
     * 创建交换机
     */
    @Bean
    public Exchange orderListenerExchange(){
        return new DirectExchange("orderListenerExchange");
    }

    /**
     * 队列Queue2绑定Exchange
     */
    @Bean
    public Binding orderListenerBinding(Queue orderListenerQueue,Exchange orderListenerExchange){
        return BindingBuilder.bind(orderListenerQueue).to(orderListenerExchange).with("orderListenerQueue").noargs();
    }



}
